package es.uc3m.setichat.utils;

import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.SignatureException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

public class SignMessage {

	public static String addSignature(String clavePrivada, String mobile, String idMessage,String auxMensaje) throws NoSuchAlgorithmException, InvalidKeySpecException, InvalidKeyException, SignatureException, UnsupportedEncodingException{
		String mensajeFirmado="";
		KeyFactory keyFactory = KeyFactory.getInstance("RSA");
		KeySpec privateKeySpec = new PKCS8EncodedKeySpec(Base64.decode(clavePrivada));
		PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);
		
		mensajeFirmado = "<idDestination>"+mobile+"</idDestination>"+"<idMessage>"+idMessage+"</idMessage>"+"<content>"+"<chatMessage>"+auxMensaje+"</chatMessage>"+"</content>";						
		Signature signFirma = Signature.getInstance("SHA1withRSA");
		signFirma.initSign(privateKey);
		signFirma.update(mensajeFirmado.getBytes("UTF-8"));						
		mensajeFirmado=Base64.encodeToString(signFirma.sign(), false);
		
		return mensajeFirmado;
	} 
	
	public static Signature verifySignature(String clavePublica, String idSource, String idMessage, String textoMensaje) throws InvalidKeySpecException, NoSuchAlgorithmException, InvalidKeyException, SignatureException, UnsupportedEncodingException{
		
		PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(Base64.decode(clavePublica)));
		String firma = "<idDestination>"+idSource+"</idDestination>"+"<idMessage>"+idMessage+"</idMessage>"+"<content>"+"<chatMessage>"+textoMensaje+"</chatMessage>"+"</content>";
		Signature firmaSign = Signature.getInstance("SHA1withRSA");
		firmaSign.initVerify(publicKey);
		firmaSign.update(firma.getBytes("UTF-8"));
		return firmaSign;
	}
}

